package com.csw.rediscachedemo.config;

import com.csw.rediscachedemo.aspect.RedisCache;
import com.csw.rediscachedemo.entity.User;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("redisCache")
public class RedisCacheController {

    /**
     * http://localhost:8080/redisCache/select?id=1
     * @param id
     * @return
     */
    @RedisCache(name = "搜索某个商品")
    @RequestMapping("select")
    public String selectTest(String id) {
        System.out.println("进入方法了");
        return  "112233";
    }

    /**
     * http://localhost:8080/redisCache/select2?id=1
     *
     * @return
     */
    //添加指定key字段的缓存
    //新增或者查询的时候
    @Cacheable(value = "aa:bb:c:e#30", key = "#id"/*, unless = "#result == null "*/)
    @RequestMapping("select2")
    public List select2(String id) {
//        System.out.println("进入方法了");
//        List list = new ArrayList<>();
//        User user = new User();
//        user.setId("1");
//        user.setName("中文");
//        list.add(user);
//        list.add(id);
//        return list;
        return null;
    }

    //删除指定key字段的缓存
    //更新修改删除操作的时候

    /**
     * [key]
     * 对象里面取key="#user.id"
     * 单个直接//key = "#user.id+','+#type"
     * key="#type"
     *aa:bb:cc  类似目录结构，整体上还是一个key前缀+key里面的值是后缀（参数值）
     *
     * 单个缓存删除，value的值是词典开头。如aa:bb:cc ,下面的是从key中间后面的删除所有符合的，如传参是user.id=1,type=2,则会删除aa:bb:cc:1后面所有类型的
     * @CacheEvict(value = {aa:bb:cc,bbb:ccc:ddd,.....等等可以写多个},key = "#user.id+'*'", allEntries = false)
     * 多个写法 @Caching(evict = { @CacheEvict(), @CacheEvict()}) 如下所示
     * @Caching(evict = { @CacheEvict(value = {aa:bb:cc,bbb:ccc:ddd,等待可以写多个},key = "#user.id+'*'", allEntries = false),
     @CacheEvict(value = {aa:bb:cc,bbb:ccc:ddd,......等等可以写多个},key = "#user.id+'*'", allEntries = false),
     ......英文逗号隔开就行里面可以写多个 })
     ，key相同value里面写多个就行，key不相同，或者需要删除后面所有的就写多个@CacheEvict
     *
     * allEntries = true 会将所有value值开头的缓存删除（key不考虑）
     *
     * @param id
     * @return
     */
    @CacheEvict(value = "aa:bb:c:e", key = "#id", allEntries = false)
    @RequestMapping("select3")
    public List select3(String id) {
        System.out.println("进入方法了");
        List list = new ArrayList<>();
        User user = new User();
        user.setId("1");
        user.setName("中文");
        list.add(user);
        list.add(id);
        return list;
    }

}
